【压测】wrk2
在针对服务接口做评估,往往需要考察这个接口的吞吐量、响应时长等,为了测试服务的接收上限,会在正式上线前对服务进行压力测试,目前业界常用的压测工具有loadrunner、jmeter、tcpcopy等。
其中wrk2是相对简单的基于lua的http基准测试工具,其可以在单个多核cpu(多线程)上产生大量的负载,通过产生恒定的吞吐量负载,来反映统计读物的延迟细节
lua是一种轻量的脚本语言,主要是为了嵌入程序中为应用程序提供灵活的拓展和定制功能
测试执行网站可用:https://www.runoob.com/try/runcode.php?filename=HelloWorld&type=lua
之所以初学者使用wrk2作为压测的入门工具:
- 无需硬件监控
- 测试请求相对比较简单
参考:https://zhaox.github.io/benchmark/2016/12/28/wrk-guidelines
安装
git clone https://github.com/giltene/wrk2.git
cd wrk2/
make # 即可安装wrk在相应目录下
压测
参数介绍
wrk
- -c 总http并发数
- -d 持续压测时间
- -t 总线程数
- -R 每秒多少个请求数
请求类型
- post请求:向服务器端发送请求,从而新增内容
- get请求:向服务器发送获取数据的请求,不会改变内容
- put请求:向服务器端发送请求,从而修改内容
- delete请求:删除内容
详情参考:https://juejin.im/post/5c0e610be51d45707261b10a
目前业内最普遍的请求就是post请求
压测类型
- post方法压力检测
- DDCC压力测试
- 登录压力测试
- 发送json压力测试
# 当发送请求是json串时
wrk.method = "POST" #一定要大写
wrk.body = "{\"result_hdfs\":\"/sample_data/train_data_"..math.random(0,2).."\",\"team\":"..math.random(1,20).."}"
wrk.headers["Content-Type"] = "application/json"
执行:
$wrk_path/wrk -t2 --latency -c20 -d10s -R50 --script=post.lua http://10.41.20.196:8140
# 开启2个线程,每个线程发送20个请求,持续发送10s,频率为50次
结果说明:
- latency:响应时长分布
- req/sec:每秒处理请求数
- 连接超时数目timeout
报错
- invalid HTTP method at 1:1 原因:在提交post需求时,wrk.method错误 解决:wrk.method = "POST"
- RuntimeError: can't start new thread 原因:多线程处理时,文件未处理完造成资源占据 解决:
- Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread 原因: 解决: